package cache

import (
	"gitee.com/gousing/cache/storage"
)

// GetInt 获取 int 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt(key string) int {
	val, _ := GetIntE(key)
	return val
}

// GetIntD 获取 int 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetIntD(key string, defaultVal int) int {
	val, err := GetIntE(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetIntE 获取 int 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetIntE(key string) (int, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val int
	err := GetDefault().Scan(key, &val)
	return val, err
}

// GetInt8 获取 int8 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt8(key string) int8 {
	val, _ := GetInt8E(key)
	return val
}

// GetInt8D 获取 int8 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt8D(key string, defaultVal int8) int8 {
	val, err := GetInt8E(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetInt8E 获取 int8 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt8E(key string) (int8, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val int8
	err := GetDefault().Scan(key, &val)
	return val, err
}

// GetInt16 获取 int16 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt16(key string) int16 {
	val, _ := GetInt16E(key)
	return val
}

// GetInt16D 获取 int16 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt16D(key string, defaultVal int16) int16 {
	val, err := GetInt16E(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetInt16E 获取 int16 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt16E(key string) (int16, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val int16
	err := GetDefault().Scan(key, &val)
	return val, err
}

// GetInt32 获取 int32 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt32(key string) int32 {
	val, _ := GetInt32E(key)
	return val
}

// GetInt32D 获取 int32 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt32D(key string, defaultVal int32) int32 {
	val, err := GetInt32E(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetInt32E 获取 int32 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt32E(key string) (int32, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val int32
	err := GetDefault().Scan(key, &val)
	return val, err
}

// GetInt64 获取 int64 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt64(key string) int64 {
	val, _ := GetInt64E(key)
	return val
}

// GetInt64D 获取 int64 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt64D(key string, defaultVal int64) int64 {
	val, err := GetInt64E(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetInt64E 获取 int64 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.IntX/UintX 适配接口的类型
func GetInt64E(key string) (int64, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val int64
	err := GetDefault().Scan(key, &val)
	return val, err
}
